From 7ee451de31ad5d10e27157c85cd45a62909ba1e3 Mon Sep 17 00:00:00 2001 From: "djm@kirby.fc.hp.com" Date: Wed, 16 Nov 2005 16:44:49 -0600 Subject: [PATCH] Fix problem if itlb miss occurs when in metaphysical mode --- xen/arch/ia64/xen/vcpu.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/xen/arch/ia64/xen/vcpu.c b/xen/arch/ia64/xen/vcpu.c index d39e4aae7c..9f2b0a186b 100644 --- a/xen/arch/ia64/xen/vcpu.c +++ b/xen/arch/ia64/xen/vcpu.c @@ -1290,12 +1290,12 @@ int warn_region0_address = 0; // FIXME later: tie to a boot parameter? IA64FAULT vcpu_translate(VCPU *vcpu, UINT64 address, BOOLEAN is_data, UINT64 *pteval, UINT64 *itir, UINT64 *iha) { + unsigned long region = address >> 61; unsigned long pta, pte, rid, rr; int i; TR_ENTRY *trp; - if (PSCB(vcpu,metaphysical_mode)) { - unsigned long region = address >> 61; + if (PSCB(vcpu,metaphysical_mode) && !(!is_data && region)) { // dom0 may generate an uncacheable physical address (msb=1) if (region && ((region != 4) || (vcpu->domain != dom0))) { // FIXME: This seems to happen even though it shouldn't. Need to track @@ -1309,7 +1309,7 @@ IA64FAULT vcpu_translate(VCPU *vcpu, UINT64 address, BOOLEAN is_data, UINT64 *pt phys_translate_count++; return IA64_NO_FAULT; } - else if (!(address >> 61) && warn_region0_address) { + else if (!region && warn_region0_address) { REGS *regs = vcpu_regs(vcpu); unsigned long viip = PSCB(vcpu,iip); unsigned long vipsr = PSCB(vcpu,ipsr); @@ -1318,7 +1318,7 @@ IA64FAULT vcpu_translate(VCPU *vcpu, UINT64 address, BOOLEAN is_data, UINT64 *pt printk("vcpu_translate: bad address %p, viip=%p, vipsr=%p, iip=%p, ipsr=%p continuing\n", address, viip, vipsr, iip, ipsr); } - rr = PSCB(vcpu,rrs)[address>>61]; + rr = PSCB(vcpu,rrs)[region]; rid = rr & RR_RID_MASK; if (is_data) { if (vcpu_quick_region_check(vcpu->arch.dtr_regions,address)) { -- 2.30.2